package com.wwe.kotlinstudy.util

/**
 * @name KotlinStudy
 * @package name：com.wwe.kotlinstudy.util
 * @anthor DavidZhang
 * @time 2018/4/17 16:04
 * @class 返回语句的学习: break/return/continue
 */
class ReturnStudy {

    fun test1() {
        loop@ for (i in 1..100) {
            for (j in 1..100) {
                if (j == 50) {
                    break@loop //直接终止loop@标记的for循环，continue以此类推
                }
            }
        }
    }

    /**这个 return 表达式从最直接包围它的函数即 test2 中返回*/
    fun test2() {
        var ints = arrayOf(0, 1, 2, 3)

        //这是一个lambda表达式
        ints.forEach {
            if (it == 0) return
            print(it)
        }
    }

    /**因为加了标签，所有它只会从lambda表达式中返回*/
    fun test3() {
        var ints = arrayOf(0, 1, 2, 3)
        ints.forEach lit@{
            if (it == 0) return@lit
            print(it)
        }
    }

    /**使用隐式标签更方便。 该标签与接受该 lambda 的函数同名*/
    fun test4() {
        var ints = arrayOf(0, 1, 2, 3)
        ints.forEach {
            if (it == 0) return@forEach
            print(it)
        }
    }

    /**用一个匿名函数替代 lambda 表达式。 匿名函数内部的 return 语句将从该匿名函数自身返回*/
    fun test5() {
        var ints = arrayOf(0, 1, 2, 3)
        ints.forEach(fun(value: Int) {
            if (value == 0) return
            print(value)
        })
    }

    //return@a 1
    //意为“从标签 @a 返回 1”，而不是“返回一个标签标注的表达式 (@a 1)”。
    //对于Kotlin的跳转，似乎看到了go关键字的身影，个人建议仅作为理解，能不用就不用，影响代码阅读性，维护性。

}